libostree: Add ostree_sysroot_deployment_set_kargs()
authorColin Walters <walters@verbum.org>
Mon, 17 Mar 2014 23:24:10 +0000 (19:24 -0400)
committerColin Walters <walters@verbum.org>
Wed, 19 Mar 2014 13:49:55 +0000 (09:49 -0400)
It turns out people sometimes want to be able to change the kernel
arguments.  Add a convenient API to do so for the current deployment.

This will be used by Anaconda.

src/libostree/ostree-sysroot-deploy.c
src/libostree/ostree-sysroot.c
src/libostree/ostree-sysroot.h

index 7fa193cafefd676f526cbd4908ccdf5c87bdf753..e2d6f05d1edcea3773a3ff027ff176c9655275b2 100644 (file)
@@ -1437,3 +1437,55 @@ ostree_sysroot_deploy_tree (OstreeSysroot     *self,
   return ret;
 }
 
+/**
+ * ostree_sysroot_deployment_set_kargs:
+ * @self: Sysroot
+ * @deployment: A deployment
+ * @new_kargs: (array zero-terminated=1) (element-type utf8): Replace deployment's kernel arguments
+ * @cancellable: Cancellable
+ * @error: Error
+ *
+ * Entirely replace the kernel arguments of @deployment with the
+ * values in @new_kargs.
+ */
+gboolean
+ostree_sysroot_deployment_set_kargs (OstreeSysroot     *self,
+                                     OstreeDeployment  *deployment,
+                                     char             **new_kargs,
+                                     GCancellable      *cancellable,
+                                     GError           **error)
+{
+  gboolean ret = FALSE;
+  guint i;
+  gs_unref_ptrarray GPtrArray *new_deployments = g_ptr_array_new_with_free_func (g_object_unref);
+  gs_unref_object OstreeDeployment *new_deployment = NULL;
+  __attribute__((cleanup(_ostree_kernel_args_cleanup))) OstreeKernelArgs *kargs = NULL;
+  gs_free char *new_options = NULL;
+  OstreeBootconfigParser *new_bootconfig;
+
+  new_deployment = ostree_deployment_clone (deployment);
+  new_bootconfig = ostree_deployment_get_bootconfig (new_deployment);
+
+  kargs = _ostree_kernel_args_new ();
+  _ostree_kernel_args_append_argv (kargs, new_kargs);
+  new_options = _ostree_kernel_args_to_string (kargs);
+  ostree_bootconfig_parser_set (new_bootconfig, "options", new_options);
+
+  for (i = 0; i < self->deployments->len; i++)
+    {
+      OstreeDeployment *cur = self->deployments->pdata[i];
+      if (cur == deployment)
+        g_ptr_array_add (new_deployments, g_object_ref (new_deployment));
+      else
+        g_ptr_array_add (new_deployments, g_object_ref (cur));
+    }
+
+  if (!ostree_sysroot_write_deployments (self, new_deployments,
+                                         cancellable, error))
+    goto out;
+
+  ret = TRUE;
+ out:
+  return ret;
+}
+
index fcbd3dc49e6048464f34d2ba3bdf42b172948dc7..70186a5808eadd1c6524391d834f873e23ade2b3 100644 (file)
@@ -1029,4 +1029,3 @@ ostree_sysroot_origin_new_from_refspec (OstreeSysroot  *sysroot,
   g_key_file_set_string (ret, "origin", "refspec", refspec);
   return ret;
 }
-
index fbf3dffc2209b9283644ccdad5f80b291b6d0331..ec4513baebb01a6c69c1a6209a54828fbf79e16a 100644 (file)
@@ -66,6 +66,12 @@ gboolean ostree_sysroot_get_repo (OstreeSysroot         *self,
                                   GCancellable          *cancellable,
                                   GError               **error);
 
+gboolean ostree_sysroot_deployment_set_kargs (OstreeSysroot     *self,
+                                              OstreeDeployment  *deployment,
+                                              char             **new_kargs,
+                                              GCancellable      *cancellable,
+                                              GError           **error);
+
 gboolean ostree_sysroot_write_deployments (OstreeSysroot     *self,
                                            GPtrArray         *new_deployments,
                                            GCancellable      *cancellable,